import os
from collections import *
+def add_quotes(s):
+ return "\"" + s.lower() + "\""
+
+def wordify(s):
+ return s.strip().rstrip(".,;:")
+
+def is_keyword(s):
+ if s == "GTK":
+ return False
+ elif s.startswith(("Gtk", "Gdk", "Pango")):
+ return True
+ elif s.startswith("G") and s[1].isupper():
+ return True
+ else:
+ return False
+
out_file = sys.argv[1]
in_files = sys.argv[2:]
{
const char *name;
const char *title;
+ const char **keywords;
const char *filename;
GDoDemoFunc func;
DemoData *children;
};
"""
-# Demo = namedtuple('Demo', ['name', 'title', 'file', 'func'])
+# Demo = namedtuple('Demo', ['name', 'title', 'keywords', 'file', 'func'])
demos = []
demo_name = filename.replace(".c", "")
with open(demo_file, 'r', encoding='utf-8') as f:
title = f.readline().replace("/*", "").strip()
-
+ keywords = set()
+ line = f.readline().strip();
+ while not line.endswith('*/'):
+ if line.startswith("* #Keywords:"):
+ keywords = keywords.union(set(map(wordify, line.replace ("* #Keywords:", "").strip().split(","))))
+ else:
+ keywords = keywords.union(set(filter(is_keyword, map(wordify, line.replace ("* ", "").split()))))
+ line = f.readline().strip()
file_output += "GtkWidget *do_" + demo_name + " (GtkWidget *do_widget);\n"
- # demos += Demo(name = demo_name,
- # title = title,
- # file = demo_file,
- # func = "do_" + title)
- demos.append((demo_name, title, filename, "do_" + demo_name, -1))
+ demos.append((demo_name, title, keywords, filename, "do_" + demo_name, -1))
# Generate a List of "Parent names"
parents = []
if not parent_name in parents:
parents.append(parent_name)
parent_ids.append(parent_index)
- demos.append(("NULL", parent_name, "NULL", "NULL", parent_index))
+ demos.append(("NULL", parent_name, set(), "NULL", "NULL", parent_index))
parent_index = parent_index + 1
for child in demos:
if child[1].startswith(parent + "/"):
title = child[1][child[1].rfind('/') + 1:]
- file_output += " { \"" + child[0] + "\", \"" + title + "\", \"" + child[2] + "\", " + child[3] + ", NULL },\n"
-
+ file_output += " { \"" + child[0] + "\", \"" + title + "\", " + "(const char*[]) {" + ", ".join(list(map(add_quotes, child[2])) + ["NULL"]) + " }, \"" + child[3] + "\", " + child[4] + ", NULL },\n"
file_output += " { NULL }\n};\n"
i = i + 1
# Do not generate one of these for demos with a parent demo
if "/" not in demo[1]:
child_array = "NULL"
- name = demo[0];
- title = demo[1];
- file = demo[2]
+ name = demo[0]
+ title = demo[1]
+ keywords = demo[2]
+ file = demo[3]
if name != "NULL":
name = "\"" + name + "\""
if title != "NULL":
if file != "NULL":
file = "\"" + file + "\""
- if demo[4] != -1:
- child_array = "child" + str(demo[4])
- file_output += " { " + name + ", " + title + ", " + file + ", " + demo[3] + ", " + child_array + " },\n"
+ if demo[5] != -1:
+ child_array = "child" + str(demo[5])
+ file_output += " { " + name + ", " + title + ", " + "(const char*[]) {" + ", ".join(list(map(add_quotes, keywords)) + ["NULL"]) + " }, " + file + ", " + demo[4] + ", " + child_array + " },\n"
file_output += " { NULL }\n};\n"
const char *name;
const char *title;
+ const char **keywords;
const char *filename;
GDoDemoFunc func;
GListModel *children_model;
PROP_FILENAME,
PROP_NAME,
PROP_TITLE,
+ PROP_KEYWORDS,
N_PROPS
};
g_value_set_string (value, self->title);
break;
+ case PROP_KEYWORDS:
+ g_value_set_boxed (value, self->keywords);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
"title",
NULL,
G_PARAM_READABLE);
+ properties[PROP_KEYWORDS] =
+ g_param_spec_string ("keywords",
+ "keywords",
+ "keywords",
+ NULL,
+ G_PARAM_READABLE);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
}
if (g_str_match_string (search_needle[i], demo->title, TRUE))
continue;
+ if (demo->keywords)
+ {
+ int j;
+ gboolean found = FALSE;
+
+ for (j = 0; !found && demo->keywords[j]; j++)
+ {
+ if (strstr (demo->keywords[j], search_needle[i]))
+ found = TRUE;
+ }
+
+ if (found)
+ continue;
+ }
+
return FALSE;
}
g_clear_pointer (&search_needle, g_strfreev);
if (text && *text)
- search_needle = g_strsplit (text, " ", 0);
+ search_needle = g_str_tokenize_and_fold (text, NULL, NULL);
gtk_filter_changed (filter, GTK_FILTER_CHANGE_DIFFERENT);
}
d->name = demo->name;
d->title = demo->title;
+ d->keywords = demo->keywords;
d->filename = demo->filename;
d->func = demo->func;
child->name = children->name;
child->title = children->title;
+ child->keywords = children->keywords;
child->filename = children->filename;
child->func = children->func;